package ml.kupin.item.listener;

import freemarker.template.Configuration;
import freemarker.template.Template;
import ml.kupin.item.vo.WebItem;
import ml.kupin.pojo.TbItem;
import ml.kupin.pojo.TbItemDesc;
import ml.kupin.service.ItemService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfig;

import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import java.io.File;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.Map;

/**
 * 静态页面生成监听器
 * 监听kupin-manager模块发送的商品添加、编辑、删除消息，并在接收到消息之后，
 * 生成对应商品的静态页面
 * <p>
 * Created by 小柯(Allen Kerr) on 17.5.5 12:05.
 */
public class PageGeneratorListener implements MessageListener {

    @Autowired
    private ItemService itemService;
    @Value("${page_generator_path}")
    private String page_generator_path;
    //1、 从 spring 容器中获得 FreeMarkerConfigurer 对象。
    @Autowired
    private FreeMarkerConfig freeMarkerConfig;

    private Logger logger = LoggerFactory.getLogger(PageGeneratorListener.class);

    @Override
    public void onMessage(Message message) {
        logger.info("PageGeneratorListener 接收到消息。");
        Long itemId = null;
        try {
            //2.1 从message中获取商品id
            String text = ((TextMessage) message).getText();
            itemId = Long.valueOf(text);
            //2.2 等待kupin-manager模块的事务提交
            Thread.sleep(1000);
            //2.3 根据商品id查询商品基本信息和描述信息
            TbItem tbItem = itemService.getItemById(itemId);
            TbItemDesc itemDesc = itemService.getItemDescById(itemId);
            if (tbItem == null || itemDesc == null) {
                logger.error("未在数据库中找到对应商品！");
                return;
            }
            WebItem item = new WebItem(tbItem);

            //3、 从 FreeMarkerConfigurer 对象中获得 Configuration 对象。
            Configuration configuration = freeMarkerConfig.getConfiguration();

            //4、 使用 Configuration 对象获得 Template 对象。
            Template template = configuration.getTemplate("item.ftl");

            //5、 创建数据集
            Map<String, Object> dataModel = new HashMap<>();
            dataModel.put("item", item);
            dataModel.put("itemDesc", itemDesc);

            //5、 创建输出文件的 Writer 对象。
            FileWriter out = new FileWriter(new File(page_generator_path + itemId + ".html"));

            //6、 调用模板对象的 process 方法， 生成文件。
            template.process(dataModel, out);

            //7、 关闭流。
            out.close();

            //输出信息
            logger.info(itemId + ".html 页面生成成功！");
        } catch (Exception e) {
            logger.error(itemId + ".html 页面生成失败！");
            e.printStackTrace();
        }
    }
}
